home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / x / volume10 / contool / part05 < prev    next >
Encoding:
Internet Message Format  |  1990-10-29  |  29.6 KB

  1. Path: uunet!zaphod.mps.ohio-state.edu!usc!cs.utexas.edu!sun-barr!newstop!sun!trantor.harris-atd.com
  2. From: news@trantor.harris-atd.com (News stuff)
  3. Newsgroups: comp.sources.x
  4. Subject: v10i038: contool -- replacement for 'cmdtool -C', Part05/06
  5. Message-ID: <144346@sun.Eng.Sun.COM>
  6. Date: 30 Oct 90 06:26:43 GMT
  7. References: <csx-10i034:contool@uunet.UU.NET>
  8. Sender: news@sun.Eng.Sun.COM
  9. Lines: 932
  10. Approved: argv@sun.com
  11.  
  12. Submitted-by: news@trantor.harris-atd.com (News stuff)
  13. Posting-number: Volume 10, Issue 38
  14. Archive-name: contool/part05
  15.  
  16. Path: trantor.harris-atd.com!melmac.harris-atd.com!chuck
  17. From: chuck@melmac.harris-atd.com (Chuck Musciano)
  18. Newsgroups: comp.sources.x
  19. Subject: Contool, part 5/6
  20. Message-ID: <4604@trantor.harris-atd.com>
  21. Date: 18 Oct 90 15:21:22 GMT
  22. Sender: news@trantor.harris-atd.com
  23. Reply-To: chuck@melmac.harris-atd.com (Chuck Musciano)
  24. Distribution: world
  25. Organization: Advanced Technology Dept., Harris Corp., Melbourne, Fl.
  26. Lines: 911
  27.  
  28. #! /bin/sh
  29. # This is a shell archive.  Remove anything before this line, then unpack
  30. # it by saving it into a file and typing "sh file".  To overwrite existing
  31. # files, type "sh file -c".  You can also feed this as standard input via
  32. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  33. # will see the following message at the end:
  34. #        "End of archive 5 (of 6)."
  35. # Contents:  filters.c
  36. # Wrapped by chuck@melmac on Fri Aug 17 10:00:53 1990
  37. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  38. if test -f 'filters.c' -a "${1}" != "-c" ; then 
  39.   echo shar: Will not clobber existing file \"'filters.c'\"
  40. else
  41. echo shar: Extracting \"'filters.c'\" \(26766 characters\)
  42. sed "s/^X//" >'filters.c' <<'END_OF_FILE'
  43. X/************************************************************************/
  44. X/*    Copyright 1988-1990 by Chuck Musciano and Harris Corporation    */
  45. X/*                                    */
  46. X/*    Permission to use, copy, modify, and distribute this software    */
  47. X/*    and its documentation for any purpose and without fee is    */
  48. X/*    hereby granted, provided that the above copyright notice    */
  49. X/*    appear in all copies and that both that copyright notice and    */
  50. X/*    this permission notice appear in supporting documentation, and    */
  51. X/*    that the name of Chuck Musciano and Harris Corporation not be    */
  52. X/*    used in advertising or publicity pertaining to distribution    */
  53. X/*    of the software without specific, written prior permission.    */
  54. X/*    Chuck Musciano and Harris Corporation make no representations    */
  55. X/*    about the suitability of this software for any purpose.  It is    */
  56. X/*    provided "as is" without express or implied warranty.  This     */
  57. X/*    software may not be sold without the prior explicit permission    */
  58. X/*    of Harris Corporation.                        */
  59. X/************************************************************************/
  60. X
  61. X/************************************************************************/
  62. X/*                                    */
  63. X/*    filters.c    contool filters dialog manager            */
  64. X/*                                    */
  65. X/************************************************************************/
  66. X
  67. X#include    <stdio.h>
  68. X#include    <sys/param.h>
  69. X#include    <sys/types.h>
  70. X#include    <xview/xview.h>
  71. X#include    <xview/panel.h>
  72. X#include    <xview/notice.h>
  73. X#include    <xview/xv_xrect.h>
  74. X
  75. X#include    "manifest.h"
  76. X#include    "contool.h"
  77. X#include    "contool_ui.h"
  78. X
  79. XEXPORT    Filter    *filters = NULL;
  80. X
  81. XPUBLIC    contool_base_objects    *contool_base;
  82. X
  83. XPRIVATE    short    single_bits[] = {
  84. X#include    "images/single.icon"
  85. X              };
  86. X
  87. XPRIVATE    short    range_bits[] = {
  88. X#include    "images/range.icon"
  89. X              };
  90. X
  91. XPRIVATE    short    empty_bits[] = {
  92. X#include    "images/empty.icon"
  93. X              };
  94. X
  95. XPRIVATE    Filter    *edit_set = NULL, *clipboard = NULL;
  96. XPRIVATE    contool_filters_objects    *contool_filters = NULL;
  97. XPRIVATE    Server_image    single, range, empty;
  98. X
  99. X/************************************************************************/
  100. XPRIVATE    int    selection_count()
  101. X
  102. X{    int    i, s, total;
  103. X
  104. X    total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
  105. X    for (i = s = 0; i < total; i++)
  106. X       if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
  107. X          s++;
  108. X    return(s);
  109. X}
  110. X
  111. X/************************************************************************/
  112. XPRIVATE    int    curr_selection()
  113. X
  114. X{    int    i, total;
  115. X
  116. X    for (i = 0, total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS); i < total; i++)
  117. X       if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
  118. X          break;
  119. X    if (i >= total)
  120. X       fprintf(stderr, "No item selected!\n");
  121. X    return(i);
  122. X}
  123. X
  124. X/************************************************************************/
  125. XPRIVATE    Filter    *duplicate_filter(f)
  126. X
  127. XFilter    *f;
  128. X
  129. X{    Filter    *new;
  130. X
  131. X    new = (Filter *) malloc(sizeof(Filter));
  132. X    *new = *f;
  133. X    new->start = strsave(f->start);
  134. X    new->stop = strsave(f->stop);
  135. X    compile_exp(new, new->start, new->stop);
  136. X    new->command = strsave(f->command);
  137. X    new->comment = strsave(f->comment);
  138. X    new->next = NULL;
  139. X    return(new);
  140. X}
  141. X
  142. X/************************************************************************/
  143. XPRIVATE    Filter    *duplicate_list(list)
  144. X
  145. XFilter    *list;
  146. X
  147. X{    Filter    *f, *head = NULL, *curr;
  148. X
  149. X    for (f = list; f; f = f->next)
  150. X       if (head == NULL)
  151. X          head = curr = duplicate_filter(f);
  152. X       else {
  153. X          curr->next = duplicate_filter(f);
  154. X          curr = curr->next;
  155. X          }
  156. X    return(head);
  157. X}
  158. X
  159. X/************************************************************************/
  160. XPRIVATE    free_filter(f)
  161. X
  162. XFilter    *f;
  163. X
  164. X{
  165. X    cond_free(f->start);
  166. X    cond_free(f->start_re);
  167. X    cond_free(f->stop);
  168. X    cond_free(f->stop_re);
  169. X    cond_free(f->command);
  170. X    cond_free(f->comment);
  171. X    free(f);
  172. X}
  173. X
  174. X/************************************************************************/
  175. XEXPORT    free_list(list)
  176. X
  177. XFilter    *list;
  178. X
  179. X{    Filter    *next;
  180. X
  181. X    for ( ; list; list = next) {
  182. X       next = list->next;
  183. X       free_filter(list);
  184. X       }
  185. X}
  186. X
  187. X/************************************************************************/
  188. XPRIVATE    update_controls()
  189. X
  190. X{    Filter    *f;
  191. X    int    i;
  192. X
  193. X    if (selection_count() == 1) {
  194. X       for (f = edit_set, i = 0; f; f = f->next, i++)
  195. X          if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
  196. X             break;
  197. X       if (f == NULL) {
  198. X          error("Internal error: filters do not match scrolling list!");
  199. X          return;
  200. X          }
  201. X       xv_set(contool_filters->filter_update, PANEL_INACTIVE, FALSE, NULL);
  202. X       xv_set(contool_filters->filter_type, PANEL_INACTIVE, FALSE, PANEL_VALUE, f->stop? 1 : 0, NULL);
  203. X       xv_set(contool_filters->start, PANEL_INACTIVE, FALSE, PANEL_VALUE, is_null(f->start), NULL);
  204. X       xv_set(contool_filters->stop, PANEL_INACTIVE, f->stop == NULL, PANEL_VALUE, is_null(f->stop), NULL);
  205. X       xv_set(contool_filters->comment, PANEL_INACTIVE, FALSE, PANEL_VALUE, is_null(f->comment), NULL);
  206. X       xv_set(contool_filters->ignore, PANEL_INACTIVE, FALSE, PANEL_VALUE, f->save? 0 : 1, NULL);
  207. X       if (f->save) {
  208. X          i = 0;
  209. X          if (f->beep) {
  210. X             i |= BEEP_BIT;
  211. X             xv_set(contool_filters->filter_beep_count, PANEL_INACTIVE, FALSE, PANEL_VALUE, f->beep, NULL);
  212. X             xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, FALSE, NULL);
  213. X             }
  214. X          else {
  215. X             xv_set(contool_filters->filter_beep_count, PANEL_INACTIVE, TRUE, NULL);
  216. X             xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, TRUE, NULL);
  217. X             }
  218. X          if (f->command) {
  219. X             i |= COMMAND_BIT;
  220. X             xv_set(contool_filters->filter_command, PANEL_INACTIVE, FALSE, PANEL_VALUE, f->command, NULL);
  221. X             xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, FALSE, NULL);
  222. X             }
  223. X          else
  224. X             xv_set(contool_filters->filter_command, PANEL_INACTIVE, TRUE, NULL);
  225. X          if (f->flash)
  226. X             i |= FLASH_BIT;
  227. X          if (f->open)
  228. X             i |= OPEN_BIT;
  229. X          if (f->stamp)
  230. X             i |= STAMP_BIT;
  231. X          xv_set(contool_filters->action, PANEL_INACTIVE, FALSE, PANEL_VALUE, i, NULL);
  232. X          }
  233. X       else {
  234. X          xv_set(contool_filters->action, PANEL_INACTIVE, TRUE, NULL);
  235. X          xv_set(contool_filters->filter_beep_count, PANEL_INACTIVE, TRUE, NULL);
  236. X          xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, TRUE, NULL);
  237. X          xv_set(contool_filters->filter_command, PANEL_INACTIVE, TRUE, NULL);
  238. X          }
  239. X       }
  240. X    else {
  241. X       xv_set(contool_filters->filter_update,     PANEL_INACTIVE, TRUE, NULL);
  242. X       xv_set(contool_filters->filter_type,       PANEL_INACTIVE, TRUE, NULL);
  243. X       xv_set(contool_filters->start,             PANEL_INACTIVE, TRUE, NULL);
  244. X       xv_set(contool_filters->stop,              PANEL_INACTIVE, TRUE, NULL);
  245. X       xv_set(contool_filters->comment,           PANEL_INACTIVE, TRUE, NULL);
  246. X       xv_set(contool_filters->ignore,            PANEL_INACTIVE, TRUE, NULL);
  247. X       xv_set(contool_filters->action,            PANEL_INACTIVE, TRUE, NULL);
  248. X       xv_set(contool_filters->filter_beep_count, PANEL_INACTIVE, TRUE, NULL);
  249. X       xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, TRUE, NULL);
  250. X       xv_set(contool_filters->filter_command,    PANEL_INACTIVE, TRUE, NULL);
  251. X       }
  252. X}
  253. X
  254. X/************************************************************************/
  255. XPRIVATE    init_filters()
  256. X
  257. X{    Filter    *f;
  258. X    int    i, total;
  259. X
  260. X    xv_set(contool_filters->filter_list, PANEL_PAINT, PANEL_NO_CLEAR, NULL);
  261. X    for (total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS); total > 0; total--)
  262. X       xv_set(contool_filters->filter_list, PANEL_LIST_DELETE, total - 1, NULL);
  263. X    xv_set(contool_filters->filter_list, PANEL_PAINT, PANEL_CLEAR, NULL);
  264. X    free_list(edit_set);
  265. X    edit_set = duplicate_list(filters);
  266. X    for (i = 0, f = edit_set; f; f = f->next, i++)
  267. X       xv_set(contool_filters->filter_list,
  268. X                PANEL_LIST_INSERT, i,
  269. X                PANEL_LIST_GLYPH,  i, f->stop? range : single,
  270. X                PANEL_LIST_STRING, i, f->start,
  271. X             NULL);
  272. X    update_controls();
  273. X}
  274. X
  275. X/************************************************************************/
  276. XPRIVATE    insert_item(pos)
  277. X
  278. Xint    pos;
  279. X
  280. X{    int    i, total;
  281. X    Filter    *f, *t;
  282. X
  283. X    total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
  284. X    for (i = 0; i < total; i++)
  285. X       if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
  286. X          xv_set(contool_filters->filter_list, PANEL_LIST_SELECT, i, FALSE, NULL);
  287. X    xv_set(contool_filters->filter_list, PANEL_LIST_INSERT, pos, NULL);
  288. X    xv_set(contool_filters->filter_list, PANEL_LIST_GLYPH, pos, empty, NULL);
  289. X    xv_set(contool_filters->filter_list, PANEL_LIST_SELECT, pos, TRUE, NULL);
  290. X    if (pos == 0) {
  291. X       f = (Filter *) malloc(sizeof(Filter));
  292. X       f->next = edit_set;
  293. X       edit_set = f;
  294. X       }
  295. X    else {
  296. X       for (i = 1, f = edit_set; i < pos; i++, f = f->next)
  297. X          ;
  298. X       t = f->next;
  299. X       f->next = (Filter *) malloc(sizeof(Filter));
  300. X       f = f->next;
  301. X       f->next = t;
  302. X       }
  303. X    f->start = f->stop = f->comment = NULL;
  304. X    f->beep = defaults.beep;
  305. X    f->command = strsave(defaults.command);
  306. X    f->flash = defaults.flash;
  307. X    f->open = defaults.open;
  308. X    f->stamp = defaults.stamp;
  309. X    f->save = TRUE;
  310. X    update_controls();
  311. X/* update the scrolling view */
  312. X}
  313. X
  314. X/************************************************************************/
  315. XPRIVATE    paste_items(pos)
  316. X
  317. Xint    pos;
  318. X
  319. X{    int    i;
  320. X    Filter    *new, *tail, *f;
  321. X
  322. X    new = duplicate_list(clipboard);
  323. X    for (f = new, i = 0; f; f = f->next, i++) {
  324. X       xv_set(contool_filters->filter_list, PANEL_LIST_INSERT, pos + i, 0);
  325. X       xv_set(contool_filters->filter_list,
  326. X                PANEL_LIST_STRING, pos + i, f->start,
  327. X                PANEL_LIST_GLYPH,  pos + i, f->stop? range : single,
  328. X             NULL);
  329. X       tail = f;
  330. X       }
  331. X    if (pos == 0) {
  332. X       tail->next = edit_set;
  333. X       edit_set = new;
  334. X       }
  335. X    else {
  336. X       for (i = 1, f = edit_set; i < pos; i++, f = f->next)
  337. X          ;
  338. X       tail->next = f->next;
  339. X       f->next = new;
  340. X       }
  341. X    update_controls();
  342. X}
  343. X
  344. X/************************************************************************/
  345. XPRIVATE    int    update_values(f, flag)
  346. X
  347. XFilter    *f;
  348. Xint    flag;
  349. X
  350. X{    char    *start, *stop, *msg;
  351. X    int    i;
  352. X
  353. X    start = (char *) xv_get(contool_filters->start, PANEL_VALUE);
  354. X    if (is_empty(start)) {
  355. X       if (flag)
  356. X          error("You must specify a starting message pattern");
  357. X       return(FALSE);
  358. X       }
  359. X    if (xv_get(contool_filters->filter_type, PANEL_VALUE) == 1)
  360. X       stop = (char *) xv_get(contool_filters->stop, PANEL_VALUE);
  361. X    else
  362. X       stop = NULL;
  363. X    if (msg = compile_exp(f, start, stop)) {
  364. X       if (flag)
  365. X          error(msg);
  366. X       return(FALSE);
  367. X       }
  368. X    if ((int) xv_get(contool_filters->ignore, PANEL_VALUE) == 0) {
  369. X       i = (int) xv_get(contool_filters->action, PANEL_VALUE);
  370. X       if (i & COMMAND_BIT)
  371. X          if (msg = (char *) xv_get(contool_filters->filter_command, PANEL_VALUE))
  372. X             f->command = strsave(msg);
  373. X          else {
  374. X             if (flag)
  375. X                error("You must specify a command for this filter");
  376. X             return(FALSE);
  377. X             }
  378. X       else
  379. X          f->command = NULL;
  380. X       if (i & BEEP_BIT)
  381. X          f->beep = (int) xv_get(contool_filters->filter_beep_count, PANEL_VALUE);
  382. X       else
  383. X          f->beep = 0;
  384. X       f->flash = (i & FLASH_BIT)? TRUE : FALSE;
  385. X       f->open = (i & OPEN_BIT)? TRUE : FALSE;
  386. X       f->stamp = (i & STAMP_BIT)? TRUE : FALSE;
  387. X       f->save = TRUE;
  388. X       }
  389. X    else
  390. X       f->save = FALSE;
  391. X    f->start = strsave(start);
  392. X    f->stop = strsave(stop);
  393. X    f->comment = strsave((char *) xv_get(contool_filters->comment, PANEL_VALUE));
  394. X    return(TRUE);
  395. X}
  396. X
  397. X/************************************************************************/
  398. XEXPORT    Menu_item    edit_filters(item, op)
  399. X
  400. XMenu_item    item;
  401. XMenu_generate    op;
  402. X
  403. X{    Filter    *f, *curr;
  404. X
  405. X    if (op == MENU_NOTIFY) {
  406. X       xv_set(contool_base->base, FRAME_BUSY, TRUE, NULL);
  407. X       if (contool_filters == NULL) {
  408. X          contool_filters = contool_filters_objects_initialize(NULL, contool_base->base);
  409. X          place_dialog(contool_base->base, contool_filters->filters);
  410. X          xv_set(contool_filters->filter_list, PANEL_LIST_ROW_HEIGHT, 16, NULL);
  411. X          single = (Server_image) xv_create(NULL, SERVER_IMAGE,
  412. X                                 XV_WIDTH, 16,
  413. X                                 XV_HEIGHT, 16,
  414. X                                 SERVER_IMAGE_BITS, single_bits,
  415. X                              0);
  416. X          range  = (Server_image) xv_create(NULL, SERVER_IMAGE,
  417. X                                 XV_WIDTH, 16,
  418. X                                 XV_HEIGHT, 16,
  419. X                                 SERVER_IMAGE_BITS, range_bits,
  420. X                              0);
  421. X          empty  = (Server_image) xv_create(NULL, SERVER_IMAGE,
  422. X                                 XV_WIDTH, 16,
  423. X                                 XV_HEIGHT, 16,
  424. X                                 SERVER_IMAGE_BITS, empty_bits,
  425. X                              0);
  426. X          }
  427. X       if (xv_get(contool_filters->filters, XV_SHOW) == FALSE) {
  428. X          edit_set = duplicate_list(filters);
  429. X          free_list(clipboard);
  430. X          clipboard = NULL;
  431. X          init_filters();
  432. X          }
  433. X       xv_set(contool_filters->filters, XV_SHOW, TRUE, NULL);
  434. X       xv_set(contool_base->base, FRAME_BUSY, FALSE, NULL);
  435. X       }
  436. X    return item;
  437. X}
  438. X
  439. X/************************************************************************/
  440. XEXPORT    int    filter_notify(item, string, client_data, op, event)
  441. X
  442. XPanel_item    item;
  443. Xchar        *string;
  444. XXv_opaque    client_data;
  445. XPanel_list_op    op;
  446. XEvent        *event;
  447. X
  448. X{    
  449. X    if (op == PANEL_LIST_OP_DESELECT || op == PANEL_LIST_OP_SELECT)
  450. X       update_controls();
  451. X    return XV_OK;
  452. X}
  453. X
  454. X/************************************************************************/
  455. XEXPORT    Menu    filter_insert_handler(menu, op)
  456. X
  457. XMenu        menu;
  458. XMenu_generate    op;
  459. X
  460. X{
  461. X    xv_set(menu, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  462. X    xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  463. X    return menu;
  464. X}
  465. X
  466. X/************************************************************************/
  467. XEXPORT    Menu_item    insert_at_top(item, op)
  468. X
  469. XMenu_item    item;
  470. XMenu_generate    op;
  471. X
  472. X{
  473. X    xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  474. X    xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  475. X    if (op == MENU_NOTIFY)
  476. X       insert_item(0);
  477. X    return item;
  478. X}
  479. X
  480. X/************************************************************************/
  481. XEXPORT    Menu_item    insert_above(item, op)
  482. X
  483. XMenu_item    item;
  484. XMenu_generate    op;
  485. X
  486. X{
  487. X    xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  488. X    xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  489. X    if (op == MENU_DISPLAY)
  490. X       xv_set(item, MENU_INACTIVE, selection_count() != 1, NULL);
  491. X    else if (op == MENU_NOTIFY)
  492. X       insert_item(curr_selection());
  493. X    return item;
  494. X}
  495. X
  496. X/************************************************************************/
  497. XEXPORT    Menu_item    insert_below(item, op)
  498. X
  499. XMenu_item    item;
  500. XMenu_generate    op;
  501. X
  502. X{
  503. X    xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  504. X    xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  505. X    if (op == MENU_DISPLAY)
  506. X       xv_set(item, MENU_INACTIVE, selection_count() != 1, NULL);
  507. X    else if (op == MENU_NOTIFY)
  508. X       insert_item(curr_selection() + 1);
  509. X    return item;
  510. X}
  511. X
  512. X/************************************************************************/
  513. XEXPORT    Menu_item    insert_at_bottom(item, op)
  514. X
  515. XMenu_item    item;
  516. XMenu_generate    op;
  517. X
  518. X{
  519. X    xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  520. X    xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  521. X    if (op == MENU_NOTIFY)
  522. X       insert_item(xv_get(contool_filters->filter_list, PANEL_LIST_NROWS));
  523. X    return item;
  524. X}
  525. X
  526. X/************************************************************************/
  527. XEXPORT    Menu    filter_edit_handler(menu, op)
  528. X
  529. XMenu        menu;
  530. XMenu_generate    op;
  531. X
  532. X{
  533. X    xv_set(menu, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  534. X    xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  535. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  536. X    return menu;
  537. X}
  538. X
  539. X/************************************************************************/
  540. XEXPORT    Menu_item    filter_cut(item, op)
  541. X
  542. XMenu_item    item;
  543. XMenu_generate    op;
  544. X
  545. X{    int    i, total;
  546. X    Filter    *f, *prev, *curr = NULL;
  547. X
  548. X    xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  549. X    xv_set(contool_filters->filter_edit, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  550. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  551. X    if (op == MENU_DISPLAY)
  552. X       xv_set(item, MENU_INACTIVE, selection_count() == 0, NULL);
  553. X    else if (op == MENU_NOTIFY) {
  554. X       free_list(clipboard);
  555. X       clipboard = NULL;
  556. X       total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
  557. X       for (prev = NULL, f = edit_set, i = 0; i < total; i++, f = f->next)
  558. X          if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i)) {
  559. X             if (clipboard == NULL)
  560. X                clipboard = curr = f;
  561. X             else {
  562. X                curr->next = f;
  563. X                curr = curr->next;
  564. X                }
  565. X             if (prev == NULL)
  566. X                edit_set = f->next;
  567. X             else
  568. X                prev->next = f->next;
  569. X             xv_set(contool_filters->filter_list, PANEL_LIST_DELETE, i, NULL);
  570. X             i--;
  571. X             total--;
  572. X             }
  573. X          else
  574. X             prev = f;
  575. X       if (curr)
  576. X          curr->next = NULL;
  577. X       update_controls();
  578. X       xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  579. X       }
  580. X    return item;
  581. X}
  582. X
  583. X/************************************************************************/
  584. XEXPORT    Menu_item    filter_copy(item, op)
  585. X
  586. XMenu_item    item;
  587. XMenu_generate    op;
  588. X
  589. X{    int    i, total;
  590. X    Filter    *f, *curr;
  591. X
  592. X    xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  593. X    xv_set(contool_filters->filter_edit, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  594. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  595. X    if (op == MENU_DISPLAY)
  596. X       xv_set(item, MENU_INACTIVE, selection_count() == 0, NULL);
  597. X    else if (op == MENU_NOTIFY) {
  598. X       free_list(clipboard);
  599. X       clipboard = NULL;
  600. X       total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
  601. X       for (f = edit_set, i = 0; i < total; i++, f = f->next)
  602. X          if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
  603. X             if (clipboard == NULL)
  604. X                clipboard = curr = duplicate_filter(f);
  605. X             else {
  606. X                curr->next = duplicate_filter(f);
  607. X                curr = curr->next;
  608. X                }
  609. X       curr->next = NULL;
  610. X       xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  611. X       }
  612. X    return item;
  613. X}
  614. X
  615. X/************************************************************************/
  616. XEXPORT    Menu_item    filter_delete(item, op)
  617. X
  618. XMenu_item    item;
  619. XMenu_generate    op;
  620. X
  621. X{    int    i, total;
  622. X    Filter    *f, *prev, *temp = NULL, *curr;
  623. X
  624. X    xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  625. X    xv_set(contool_filters->filter_edit, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  626. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  627. X    if (op == MENU_DISPLAY)
  628. X       xv_set(item, MENU_INACTIVE, selection_count() == 0, NULL);
  629. X    else if (op == MENU_NOTIFY) {
  630. X       total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
  631. X       for (prev = NULL, f = edit_set, i = 0; i < total; i++, f = f->next)
  632. X          if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i)) {
  633. X             if (temp == NULL)
  634. X                temp = curr = f;
  635. X             else {
  636. X                curr->next = f;
  637. X                curr = curr->next;
  638. X                }
  639. X             if (prev == NULL)
  640. X                edit_set = f->next;
  641. X             else
  642. X                prev->next = f->next;
  643. X             xv_set(contool_filters->filter_list, PANEL_LIST_DELETE, i, NULL);
  644. X             i--;
  645. X             total--;
  646. X             }
  647. X          else
  648. X             prev = f;
  649. X       if (curr)
  650. X          curr->next = NULL;
  651. X       free_list(temp);
  652. X       update_controls();
  653. X       xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  654. X       }
  655. X    return item;
  656. X}
  657. X
  658. X/************************************************************************/
  659. XEXPORT    Menu_item    filter_paste(item, op)
  660. X
  661. XMenu_item    item;
  662. XMenu_generate    op;
  663. X
  664. X{
  665. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  666. X    if (op == MENU_DISPLAY)
  667. X       xv_set(item, MENU_INACTIVE, clipboard == NULL, NULL);
  668. X    return item;
  669. X}
  670. X
  671. X/************************************************************************/
  672. XEXPORT    Menu_item    paste_at_top(item, op)
  673. X
  674. XMenu_item    item;
  675. XMenu_generate    op;
  676. X
  677. X{
  678. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  679. X    if (op == MENU_NOTIFY)
  680. X       paste_items(0);
  681. X    return item;
  682. X}
  683. X
  684. X/************************************************************************/
  685. XEXPORT    Menu_item    paste_above(item, op)
  686. X
  687. XMenu_item    item;
  688. XMenu_generate    op;
  689. X
  690. X{
  691. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  692. X    if (op == MENU_DISPLAY)
  693. X       xv_set(item, MENU_INACTIVE, selection_count() != 1, NULL);
  694. X    else if (op == MENU_NOTIFY)
  695. X       paste_items(curr_selection());
  696. X    return item;
  697. X}
  698. X
  699. X/************************************************************************/
  700. XEXPORT    Menu_item    paste_below(item, op)
  701. X
  702. XMenu_item    item;
  703. XMenu_generate    op;
  704. X
  705. X{
  706. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  707. X    if (op == MENU_DISPLAY)
  708. X       xv_set(item, MENU_INACTIVE, selection_count() != 1, NULL);
  709. X    else if (op == MENU_NOTIFY)
  710. X       paste_items(curr_selection() + 1);
  711. X    return item;
  712. X}
  713. X
  714. X/************************************************************************/
  715. XEXPORT    Menu_item    paste_at_bottom(item, op)
  716. X
  717. XMenu_item    item;
  718. XMenu_generate    op;
  719. X
  720. X{
  721. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  722. X    if (op == MENU_NOTIFY)
  723. X       paste_items((int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS));
  724. X    return item;
  725. X}
  726. X
  727. X/************************************************************************/
  728. XEXPORT    void    filter_update(item, event)
  729. X
  730. XPanel_item    item;
  731. XEvent        *event;
  732. X
  733. X{    int    i, curr;
  734. X    Filter    *f;
  735. X
  736. X    xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  737. X
  738. X    curr = curr_selection();
  739. X    for (i = 0, f = edit_set; i < curr; i++, f = f->next)
  740. X       ;
  741. X    if (update_values(f, TRUE))
  742. X       xv_set(contool_filters->filter_list,
  743. X             PANEL_LIST_STRING, curr, f->start,
  744. X             PANEL_LIST_GLYPH,  curr, f->stop? range : single,
  745. X              NULL);
  746. X}
  747. X
  748. X/************************************************************************/
  749. XEXPORT    void    set_filter_type(item, value, event)
  750. X
  751. XPanel_item    item;
  752. Xint        value;
  753. XEvent        *event;
  754. X
  755. X{
  756. X    xv_set(contool_filters->stop, PANEL_INACTIVE, value == 0, NULL);
  757. X}
  758. X
  759. X/************************************************************************/
  760. XEXPORT    void    set_filter_action(item, value, event)
  761. X
  762. XPanel_item    item;
  763. Xint        value;
  764. XEvent        *event;
  765. X
  766. X{    contool_filters_objects    *ip = (contool_filters_objects *) xv_get(item, XV_KEY_DATA, INSTANCE);
  767. X
  768. X    if (value == 0) { /* save this message */
  769. X       xv_set(ip->action,            PANEL_INACTIVE, FALSE, NULL);
  770. X       xv_set(ip->filter_beep_count, PANEL_INACTIVE, !((int) xv_get(ip->action, PANEL_VALUE) & BEEP_BIT), NULL);
  771. X       xv_set(ip->filter_beep_times, PANEL_INACTIVE, !((int) xv_get(ip->action, PANEL_VALUE) & BEEP_BIT), NULL);
  772. X       xv_set(ip->filter_command,    PANEL_INACTIVE, !((int) xv_get(ip->action, PANEL_VALUE) & COMMAND_BIT), NULL);
  773. X       }
  774. X    else { /* ignore this message */
  775. X       xv_set(ip->action,            PANEL_INACTIVE, TRUE, NULL);
  776. X       xv_set(ip->filter_beep_count, PANEL_INACTIVE, TRUE, NULL);
  777. X       xv_set(ip->filter_beep_times, PANEL_INACTIVE, TRUE, NULL);
  778. X       xv_set(ip->filter_command,    PANEL_INACTIVE, TRUE, NULL);
  779. X       }
  780. X}
  781. X
  782. X/************************************************************************/
  783. XEXPORT    void    set_match_action(item, value, event)
  784. X
  785. XPanel_item    item;
  786. Xunsigned int    value;
  787. XEvent        *event;
  788. X
  789. X{    contool_filters_objects    *ip = (contool_filters_objects *) xv_get(item, XV_KEY_DATA, INSTANCE);
  790. X    
  791. X    xv_set(ip->filter_beep_count, PANEL_INACTIVE, !(value & BEEP_BIT), NULL);
  792. X    xv_set(ip->filter_beep_times, PANEL_INACTIVE, !(value & BEEP_BIT), NULL);
  793. X    xv_set(ip->filter_command,    PANEL_INACTIVE, !(value & COMMAND_BIT), NULL);
  794. X}
  795. X
  796. X/************************************************************************/
  797. XEXPORT    void    filter_done(frame)
  798. X
  799. XFrame        frame;
  800. X
  801. X{
  802. X    free_list(edit_set);
  803. X    edit_set = NULL;
  804. X    free_list(clipboard);
  805. X    clipboard = NULL;
  806. X    xv_set(frame, XV_SHOW, FALSE, 0);
  807. X}
  808. X
  809. X/************************************************************************/
  810. XPRIVATE    int    check_for_update()
  811. X
  812. X{    int    i, result, curr, diff = FALSE;
  813. X    Filter    *f, new;
  814. X
  815. X    if (selection_count() != 1)
  816. X       return(TRUE);
  817. X    curr = curr_selection();
  818. X    for (i = 0, f = edit_set; i < curr; i++, f = f->next)
  819. X       ;
  820. X    new = *f;
  821. X    if (update_values(&new, FALSE) == FALSE)
  822. X       diff = TRUE;
  823. X    else if ((f->start != NULL && new.start == NULL) || (f->start == NULL && new.start != NULL))
  824. X       diff = TRUE;
  825. X    else if ((f->stop != NULL && new.stop == NULL) || (f->stop == NULL && new.stop != NULL))
  826. X       diff = TRUE;
  827. X    else if ((f->comment != NULL && new.comment == NULL) || (f->comment == NULL && new.comment != NULL))
  828. X       diff = TRUE;
  829. X    else if ((f->command != NULL && new.command == NULL) || (f->command == NULL && new.command != NULL))
  830. X       diff = TRUE;
  831. X    else if (f->save != new.save || f->beep != new.beep || f->flash != new.flash || f->open != new.open || f->stamp != new.stamp)
  832. X       diff = TRUE;
  833. X    else if (f->start && strcmp(f->start, new.start) != 0)
  834. X       diff = TRUE;
  835. X    else if (f->stop && strcmp(f->stop, new.stop) != 0)
  836. X       diff = TRUE;
  837. X    else if (f->comment && strcmp(f->comment, new.comment) != 0)
  838. X       diff = TRUE;
  839. X    else if (f->command && strcmp(f->command, new.command) != 0)
  840. X       diff = TRUE;
  841. X    if (diff) {
  842. X       result = notice_prompt(contool_base->base, NULL,
  843. X                        NOTICE_MESSAGE_STRINGS,
  844. X                           "You have modified the attributes of the selected filter.",
  845. X                           " ",
  846. X                           "Do you wish to perform an Update before doing an Apply?",
  847. X                           NULL,
  848. X                        NOTICE_BUTTON_YES, "Update, then Apply",
  849. X                        NOTICE_BUTTON_NO, "Apply",
  850. X                        NOTICE_BUTTON, "Cancel", 101,
  851. X                     NULL);
  852. X       if (result == NOTICE_YES)
  853. X          filter_update(contool_filters->filters, NULL);
  854. X       return(result != 101);
  855. X       }
  856. X    return(TRUE);
  857. X}
  858. X
  859. X/************************************************************************/
  860. XEXPORT    void    accept_filters(item, event)
  861. X
  862. XPanel_item    item;
  863. XEvent        *event;
  864. X
  865. X{    Filter    *f;
  866. X    int    i, total;
  867. X    char    *msg = NULL;
  868. X
  869. X    if (!check_for_update()) {
  870. X       xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  871. X       return;
  872. X       }
  873. X
  874. X    total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
  875. X    for (i = 0; i < total; i++)
  876. X       if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
  877. X          xv_set(contool_filters->filter_list, PANEL_LIST_SELECT, i, FALSE, NULL);
  878. X    for (f = edit_set, i = 0; f; f = f->next, i++)
  879. X       if (is_empty(f->start) || (msg = compile_exp(f, f->start, f->stop))) {
  880. X          xv_set(contool_filters->filter_list, PANEL_LIST_SELECT, i, TRUE, NULL);
  881. X          update_controls();
  882. X          error(msg? msg : "No pattern is specified for the indicated filter");
  883. X          xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  884. X          return;
  885. X          }
  886. X    free_list(filters);
  887. X    filters = edit_set;
  888. X    if (xv_get(contool_filters->filters, FRAME_CMD_PUSHPIN_IN))
  889. X       edit_set = duplicate_list(filters);
  890. X    else {
  891. X       edit_set = NULL;
  892. X       free_list(clipboard);
  893. X       clipboard = NULL;
  894. X       }
  895. X    filters_changed();
  896. X}
  897. X
  898. X/************************************************************************/
  899. XEXPORT    void    reset_filters(item, event)
  900. X
  901. XPanel_item    item;
  902. XEvent        *event;
  903. X
  904. X{
  905. X    init_filters();
  906. X    xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  907. X}
  908. END_OF_FILE
  909. if test 26766 -ne `wc -c <'filters.c'`; then
  910.     echo shar: \"'filters.c'\" unpacked with wrong size!
  911. fi
  912. # end of 'filters.c'
  913. fi
  914. echo shar: End of archive 5 \(of 6\).
  915. cp /dev/null ark5isdone
  916. MISSING=""
  917. for I in 1 2 3 4 5 6 ; do
  918.     if test ! -f ark${I}isdone ; then
  919.     MISSING="${MISSING} ${I}"
  920.     fi
  921. done
  922. if test "${MISSING}" = "" ; then
  923.     echo You have unpacked all 6 archives.
  924.     rm -f ark[1-9]isdone
  925. else
  926.     echo You still need to unpack the following archives:
  927.     echo "        " ${MISSING}
  928. fi
  929. ##  End of shell archive.
  930. exit 0
  931.  
  932. Chuck Musciano                ARPA  : chuck@trantor.harris-atd.com
  933. Harris Corporation             Usenet: ...!uunet!x102a!trantor!chuck
  934. PO Box 37, MS 3A/1912            AT&T  : (407) 727-6131
  935. Melbourne, FL 32902            FAX   : (407) 729-2537
  936.  
  937. A good newspaper is never good enough,
  938.     but a lousy newspaper is a joy forever.        -- Garrison Keillor
  939.  
  940. dan
  941. ----------------------------------------------------
  942. O'Reilly && Associates   argv@sun.com / argv@ora.com
  943. Opinions expressed reflect those of the author only.
  944.